package com.candoit.webapps.pricing.controllers;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.candoit.webapps.pricing.model.Articulo;
import com.candoit.webapps.pricing.model.Categoria;
import com.candoit.webapps.pricing.model.CentroCostos;
import com.candoit.webapps.pricing.model.Maquina;
import com.candoit.webapps.pricing.model.MaquinaArticulo;
import com.candoit.webapps.pricing.model.MaquinaArticuloFK;
import com.candoit.webapps.pricing.util.CentroCostosMaquina;
import com.candoit.webapps.pricing.util.ConsumoMaquinaPorArticulo;
import com.candoit.webapps.pricing.util.QueryUtil;

@ManagedBean(name = "maquinaCtrl")
@ViewScoped
public class MaquinaController extends AbstractController{
	
	private List<CentroCostosMaquina> ccMaquinas;
	
	private Maquina maquinaSelected;
	
	private List<ConsumoMaquinaPorArticulo> consumoMaquinas;
	
	private Double nivelProductivoTotal;
	
	private Double nivelProductivoPromedio;
	
	private Integer totalMaquinas;
	
	public MaquinaController(){
		this.saveSuccess = false;
	}
	
	public Maquina getMaquinaSelected() {
		if (maquinaSelected == null){
			maquinaSelected = new Maquina();
		}
		return maquinaSelected;
	}

	public void setMaquinaSelected(Maquina maquinaSelected) {
		this.maquinaSelected = maquinaSelected;
	}
	
	public void saveMaquina(){
		Iterator<CentroCostosMaquina> it = ccMaquinas.iterator();
		while (it.hasNext()){
			CentroCostosMaquina centroMaq = (CentroCostosMaquina) it.next();
			Maquina maquina = QueryUtil.getInstance().getMaquinaByCentroCostos(centroMaq.getCentro());
			if (maquina == null){
				maquina = new Maquina();
				maquina.setCantidad(centroMaq.getCantidad());
				maquina.setHorasMes(centroMaq.getHorasMensuales());
				maquina.setUnidadMedida(centroMaq.getUnidadMedida());
				maquina.setProduccionMensual(centroMaq.getProduccionMensual());
				maquina.setCentro(centroMaq.getCentro());
				maquina.setNombre(centroMaq.getCentro().getNombre());
				this.save(maquina);
			}else{
				maquina.setCantidad(centroMaq.getCantidad());
				maquina.setHorasMes(centroMaq.getHorasMensuales());
				maquina.setUnidadMedida(centroMaq.getUnidadMedida());
				maquina.setProduccionMensual(centroMaq.getProduccionMensual());
				this.update(maquina);
			}
		}

	}
	
	public void removeMaquina(){
		this.remove(maquinaSelected);
		maquinaSelected = null;
	}
	
	public void clearData(){
		this.saveSuccess = false;
		this.deleteSuccess = false;
		this.maquinaSelected = null;
	}

	public List<ConsumoMaquinaPorArticulo> getConsumoMaquinas() {
		this.fillListConsumo();
		return consumoMaquinas;
	}

	public void setConsumoMaquinas(List<ConsumoMaquinaPorArticulo> consumoMaquinas) {
		this.consumoMaquinas = consumoMaquinas;
	}
	
	private void fillListConsumo(){
		List<Articulo> articulos = QueryUtil.getInstance().getArticulos();
		Iterator<Articulo> it = articulos.iterator();
		consumoMaquinas = new ArrayList<ConsumoMaquinaPorArticulo>();
		while (it.hasNext()){
				Articulo art = (Articulo) it.next();
				ConsumoMaquinaPorArticulo consumoArt = new ConsumoMaquinaPorArticulo();
				MaquinaArticulo maqArticulo = QueryUtil.getInstance().getMaquinaArticulo(maquinaSelected, art);
				if (maqArticulo != null){
					consumoArt.setSelected(true);
					consumoArt.setConsumo(maqArticulo.getConsummo());
				}else{
					consumoArt.setSelected(false);
					consumoArt.setConsumo(0.00d);
				}
				consumoArt.setArticulo(art);
				consumoArt.setMaquina(maquinaSelected);
				consumoMaquinas.add(consumoArt);
		}
	}
	
	public void actualizarConsumo(){
		Iterator<ConsumoMaquinaPorArticulo> it = consumoMaquinas.iterator();
		while (it.hasNext()){
			ConsumoMaquinaPorArticulo consArt = (ConsumoMaquinaPorArticulo) it.next();
			MaquinaArticulo maqArt = QueryUtil.getInstance().getMaquinaArticulo(consArt.getMaquina(), consArt.getArticulo());
			if (consArt.isSelected()){
				if (maqArt != null){
					maqArt.setConsummo(consArt.getConsumo());
					this.update(maqArt);
				}else{
					maqArt = new MaquinaArticulo();
					MaquinaArticuloFK fk = new MaquinaArticuloFK();
					fk.setArticulo(consArt.getArticulo());
					fk.setMaquina(consArt.getMaquina());
					maqArt.setMaquinaArticuloFk(fk);
					maqArt.setConsummo(consArt.getConsumo());
					this.save(maqArt);
				} 
			}else{
				if(maqArt != null ){
					this.remove(maqArt);
				}
			}
		}
		
		this.saveSuccess = true;
	}

	public List<CentroCostosMaquina> getCcMaquinas() {
		ccMaquinas = new ArrayList<CentroCostosMaquina>();
		List<CentroCostos> centros = QueryUtil.getInstance().getCentroCostosByCategoria(Categoria.PRODUCTION_CODE);
		Iterator<CentroCostos> it = centros.iterator();
		totalMaquinas = 0;
		nivelProductivoTotal = 0.00d;
		while (it.hasNext()){
			   CentroCostos centro = (CentroCostos) it.next();
			   CentroCostosMaquina output = new CentroCostosMaquina();
			   output.setCentro(centro);
			   Maquina maquina = QueryUtil.getInstance().getMaquinaByCentroCostos(centro);
			   if (maquina != null){
				   output.setCantidad(maquina.getCantidad());
				   output.setHorasMensuales(maquina.getHorasMes());
				   output.setProduccionMensual(maquina.getProduccionMensual());
				   output.setUnidadMedida(maquina.getUnidadMedida());
				   totalMaquinas += maquina.getCantidad();
				   nivelProductivoTotal += maquina.getProduccionMensual();
				   if (maquina.getCantidad() > 0){
					   output.setProduccionMensualTotal(maquina.getProduccionMensual() /maquina.getCantidad());
				   }   
				  }else{
				   output.setCantidad(0);
				   output.setHorasMensuales(0);
				   output.setProduccionMensual(0.00d);
				   output.setUnidadMedida(null);
			   }
			   ccMaquinas.add(output);
			   
		}
		
		return ccMaquinas;
	}

	public void setCcMaquinas(List<CentroCostosMaquina> ccMaquinas) {
		this.ccMaquinas = ccMaquinas;
	}

	public Double getNivelProductivoTotal() {
		return nivelProductivoTotal;
	}

	public void setNivelProductivoTotal(Double nivelProductivoTotal) {
		this.nivelProductivoTotal = nivelProductivoTotal;
	}

	public Double getNivelProductivoPromedio() {
		if (totalMaquinas > 0){
			nivelProductivoPromedio = nivelProductivoTotal/totalMaquinas;
		}
		return nivelProductivoPromedio;
	}

	public void setNivelProductivoPromedio(Double nivelProductivoPromedio) {
		this.nivelProductivoPromedio = nivelProductivoPromedio;
	}

	public Integer getTotalMaquinas() {
		return totalMaquinas;
	}

	public void setTotalMaquinas(Integer totalMaquinas) {
		this.totalMaquinas = totalMaquinas;
	}
	
	
	
	

}
